package com.itheima.day18.第五题;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*现获取到一个Map集合，集合中以属性名称对应属性值的方式存放了一个学生对象的信息，如下：

HashMap<String, Object> map = new HashMap<>();
map.put("id", "heima001");
map.put("name", "张三");
map.put("age", 23);
map.put("birthday", "1999-09-09");
这些信息与学生类（Student）中的属性一一对应

请利用反射的知识，将集合中的属性值通过学生实体类的set方法，封装到一个学生对象中，并打印该对象展示。*/
public class Demo {
    public static void main(String[] args) throws Exception {
        HashMap<String, Object> map = new HashMap<>();
        map.put("id", "heima001");
        map.put("name", "张三");
        map.put("age", 23);
        map.put("birthday", "1999-09-09");

        //利用反射创建类对象
        Class<?> aClass = Class.forName("com.itheima.day18.第五题.Student");
        //创建该类的对象
         Student student = (Student) aClass.newInstance();
         /*
         //遍历map集合赋值
        Set<Map.Entry<String, Object>> entries = map.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            //获取属性
            Field field = aClass.getDeclaredField(entry.getKey());
            //关闭校验
            field.setAccessible(true);
            //写入属性值
            field.set(student,entry.getValue());
        }
         */
         //获取属性数组
        Field[] fields = aClass.getDeclaredFields();
        //遍历属性数组赋值
        for (Field field : fields) {
            if (map.containsKey(field.getName())){
                //获取属性
                Field field1 = aClass.getDeclaredField(field.getName());
                //关闭校验
                field1.setAccessible(true);
                //写入属性值
                field1.set(student,map.get(field.getName()));
            }
        }

        //获取展示方法
        Method toString = aClass.getDeclaredMethod("toString");
        System.out.println(toString.invoke(student));


    }
}
